﻿using System;
using System.Collections;
using System.Linq;
using System.Text;
using wdwp.Desktop.widgetLib.CommonTypes;
using widgetLoader.Properties;
using System.IO;

namespace wdwp.Desktop.Loader
{
    /// <summary>
    /// 위젯별 세팅을 로드하고 저장하고 관리하는 역활을 담당함  
    /// </summary>
    internal class SettingsManager
    {
        //ArrayList m_arCustomSettings;   //사용자 임의 추가 설정 저장소 
        public static readonly string PERSONAL_SETTING_FILE = "wdgt.settings.data";

        public SettingsManager()    
        { 
        }

        /// <summary>
        /// 런처로부터 넘겨받은 정보에 맞추어 로더의 세팅을 결정하고 
        /// 위젯 고유의 세팅은 파일로부터 로드한다.
        /// </summary>
        /// <param name="baseSettings">런처로부터 넘겨받은 파일을 역 직렬화 한 객체</param>
        public void load(sWidgetInfo baseSettings)
        {
            try
            {
                //위젯 초기 설정과 관련된 부분을 로드
                Settings.Default.Name = baseSettings.Name;
                Settings.Default.Uri = baseSettings.FullHTMLUri;
                Settings.Default.Width = baseSettings.Width;
                Settings.Default.Height = baseSettings.Height;
                
                //파일 경로에서 폴더만 뽑아냄 
                string fileName = baseSettings.FullHTMLUri;                
                string DirName = fileName.Substring(0, fileName.LastIndexOf('\\'));

                //초기 위치에 대한 위젯별 세팅이 있는지 알아내서 있으면 적용한다.
                if (chkFileExists(PERSONAL_SETTING_FILE, DirName))
                {
                    sWidgetInfo sw = new sWidgetInfo();
                    object boxref = (object)sw;
                    read(DirName + "\\" + PERSONAL_SETTING_FILE, ref boxref);

                    //위젯별로 독립된 세팅들을 적용 
                    Settings.Default.StartX = ((sWidgetInfo)boxref).StartX;
                    Settings.Default.StartY = ((sWidgetInfo)boxref).StartY;
                    Settings.Default.Opacity = (int)((sWidgetInfo)boxref).Opacity;
                }
            }
            catch (Exception exc)
            {
                throw exc;
            }

        }

        /// <summary>
        /// 현재 로더의 세팅을 파일로 전환시킨다. 
        /// </summary>
        public void unload()
        {
            try
            {
                sWidgetInfo widgetInfo = new sWidgetInfo();
                widgetInfo.Name = Settings.Default.Name;
                widgetInfo.FullHTMLUri = Settings.Default.Uri;
                widgetInfo.Width = Settings.Default.Width;
                widgetInfo.Height = Settings.Default.Height;

                widgetInfo.StartX = Settings.Default.StartX;
                widgetInfo.StartY = Settings.Default.StartY;
                widgetInfo.Opacity = Settings.Default.Opacity;

                //파일 경로에서 폴더만 뽑아냄 
                string fileName = Settings.Default.Uri;
                string DirName = fileName.Substring(0, fileName.LastIndexOf('\\'));

                save(DirName + "\\" + PERSONAL_SETTING_FILE, widgetInfo as object);
            }
            catch (Exception exc)
            {
                throw exc;
            }
        }
        
        /// <summary>
        /// 디렉토리에 파일이 있는지 검사한다. (임시)
        /// </summary>
        /// <param name="strfileName">확인해보고 싶은 파일의 경로와 이름 </param>
        /// <param name="strBaseDir">파일이 있다고 판단되는 폴더이름</param>
        /// <returns></returns>
        private bool chkFileExists(string strfileName, string strBaseDir)
        {
            DirectoryInfo myDir = new DirectoryInfo(strBaseDir);
            FileInfo[] files = myDir.GetFiles(strfileName);

            return (files.Length > 0 ? true : false);
        }


        /// <summary>
        /// 이진 파일을 읽어 객체로 전환시킨다. 
        /// </summary>
        /// <param name="loadFileName">이진파일</param>
        /// <param name="SettingsObj">값이 저장될 객체</param>
        public void read(string loadFileName, ref object SettingsObj)
        {
            try
            {
                Serializer.DeSerialize(loadFileName, ref SettingsObj);                
            }
            catch (Exception exc)
            {
                throw exc;
            }
        }


        /// <summary>
        /// 이진 파일을 읽어 이를 저장한다.
        /// </summary>
        /// <param name="saveFileName">저장될 이진파일</param>
        /// <param name="SettingsObj">값이 저장될 객체</param>
        public void save(string saveFileName, object SettingsObj)
        {
            try
            {
                Serializer.Serialize(saveFileName, SettingsObj);
            }
            catch (Exception exc)
            {
                throw exc;
            }
        }


    }
}
